home *** CD-ROM | disk | FTP | other *** search
/ Complete Linux / Complete Linux.iso / docs / system / mail / transpor / ifmail23.z / ifmail23 / ifmail / ifgate / rfcmsg.c < prev    next >
Encoding:
C/C++ Source or Header  |  1994-04-03  |  2.8 KB  |  154 lines

  1. #include <stdlib.h>
  2. #include <stdio.h>
  3. #include <ctype.h>
  4. #include <string.h>
  5. #include "xutil.h"
  6. #include "lutil.h"
  7. #include "rfcmsg.h"
  8.  
  9. #ifndef TRUE
  10. #define TRUE 1
  11. #define FALSE 0
  12. #endif
  13.  
  14. #ifndef BUFSIZ
  15. #define BUFSIZ 64
  16. #endif
  17.  
  18. #define KWDCHARS "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_"
  19.  
  20. extern char *bgets(char *,int,FILE *);
  21.  
  22. rfcmsg *parsrfc(fp)
  23. FILE *fp;
  24. {
  25.     int    linecont=FALSE,newcont,firstline;
  26.     rfcmsg    *start=NULL, *cur=NULL;
  27.     char    buffer[BUFSIZ];
  28.     char    *p;
  29.  
  30.     while(bgets(buffer,BUFSIZ-1,fp) && strcmp(buffer,"\n"))
  31.     {
  32.         newcont=(buffer[strlen(buffer)-1] != '\n');
  33.         debug(17,"Line read: \"%s\" - %s continued",
  34.             buffer,newcont?"to be":"not to be");
  35.         if (linecont)
  36.         {
  37.             debug(17,"this is a continuation of a long line");
  38.             cur->val=xstrcat(cur->val,buffer);
  39.         }
  40.         else
  41.         {
  42.             if (isspace(buffer[0]))
  43.             {
  44.                 debug(17,"this is a continuation line");
  45.                 if (!cur)
  46.                 {
  47.                     debug(17,"Wrong first line: \"%s\"",buffer);
  48.                     cur=(rfcmsg *)
  49.                         xmalloc(sizeof(rfcmsg));
  50.                     start=cur;
  51.                     cur->next=NULL;
  52.                     cur->key=xstrcpy("X-Body-Start");
  53.                     cur->val=xstrcpy(buffer);
  54.                     break;
  55.                 }
  56.                 else cur->val=xstrcat(cur->val,buffer);
  57.             }
  58.             else
  59.             {
  60.                 debug(17,"this is a header line");
  61.                 if (cur)
  62.                 {
  63.                     firstline=FALSE;
  64.                     (cur->next)=(rfcmsg *)
  65.                         xmalloc(sizeof(rfcmsg));
  66.                     cur=cur->next;
  67.                 }
  68.                 else
  69.                 {
  70.                     firstline=TRUE;
  71.                     cur=(rfcmsg *)
  72.                         xmalloc(sizeof(rfcmsg));
  73.                     start=cur;
  74.                 }
  75.                 cur->next=NULL;
  76.                 cur->key=NULL;
  77.                 cur->val=NULL;
  78.                 if (firstline && !strncmp(buffer,"From ",5))
  79.                 {
  80.                     debug(17,"This is a uucpfrom line");
  81.                     cur->key=xstrcpy("X-UUCP-From");
  82.                     cur->val=xstrcpy(buffer+4);
  83.                 }
  84.                 else if ((p=strchr(buffer,':')) &&
  85.                          (p > buffer) && /* ':' isn't 1st chr */
  86.                      isspace(*(p+1)) && /* space past ':' */
  87.                          (strspn(buffer,KWDCHARS) == (p-buffer)))
  88.                 {
  89.                     debug(17,"This is a regular header");
  90.                     *p='\0';
  91.                     cur->key=xstrcpy(buffer);
  92.                     cur->val=xstrcpy(p+1);
  93.                 }
  94.                 else 
  95.                 {
  96.                     debug(17,"Non-header line: \"%s\"",buffer);
  97.                     cur->key=xstrcpy("X-Body-Start");
  98.                     cur->val=xstrcpy(buffer);
  99.                     break;
  100.                 }
  101.             }
  102.         }
  103.         linecont=newcont;
  104.     }
  105.     return(start);
  106. }
  107.  
  108. void tidyrfc(msg)
  109. rfcmsg *msg;
  110. {
  111.     rfcmsg *nxt;
  112.  
  113.     for (;msg;msg=nxt)
  114.     {
  115.         nxt=msg->next;
  116.         if (msg->key) free(msg->key);
  117.         if (msg->val) free(msg->val);
  118.         free(msg);
  119.     }
  120.     return;
  121. }
  122.  
  123. void dumpmsg(msg,fp)
  124. rfcmsg *msg;
  125. FILE *fp;
  126. {
  127.     char *p;
  128.  
  129.     p=hdr("X-Body-Start",msg);
  130.     for (;msg;msg=msg->next) if (strcasecmp(msg->key,"X-Body-Start"))
  131.     {
  132.         if (!strcasecmp(msg->key,"X-UUCP-From"))
  133.             fputs("From",fp);
  134.         else
  135.         {
  136.             fputs(msg->key,fp);
  137.             fputs(":",fp);
  138.         }
  139.         fputs(msg->val,fp);
  140.     }
  141.     fputs("\n",fp);
  142.     if (p) fputs(p,fp);
  143.     return;
  144. }
  145.  
  146. char *hdr(key,msg)
  147. char *key;
  148. rfcmsg *msg;
  149. {
  150.     for (;msg;msg=msg->next)
  151.         if (!strcasecmp(key,msg->key)) return(msg->val);
  152.     return(NULL);
  153. }
  154.